import 'package:flutter/material.dart';

/// Dart注解示例
class AnnotationsExample extends StatefulWidget {
  const AnnotationsExample({super.key});

  @override
  State<AnnotationsExample> createState() => _AnnotationsExampleState();
}

class _AnnotationsExampleState extends State<AnnotationsExample> {
  String result = '点击下方按钮查看注解示例';

  // @override 注解
  @override
  void initState() {
    super.initState();
    // 初始化逻辑
  }

  // @deprecated 注解
  @deprecated
  void oldMethod() {
    // 这个方法已经废弃
  }

  // 自定义注解
  @Todo('实现此功能', '张三')
  void futureFeature() {
    // 待实现
  }

  void _demonstrateOverride() {
    setState(() {
      result = '''
【@override 注解】
用于标记重写父类或实现接口的方法。

示例:
class Animal {
  void makeSound() {
    print('一些声音');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('汪汪汪');
  }
}

作用:
• 提高代码可读性
• 编译器会检查是否真的重写了父类方法
• 如果父类没有这个方法会报错

在Flutter中常见用法:
@override
Widget build(BuildContext context) {
  return Container();
}

@override
void initState() {
  super.initState();
}
      ''';
    });
  }

  void _demonstrateDeprecated() {
    setState(() {
      result = '''
【@deprecated 注解】
标记已过时的API，提醒开发者不要使用。

示例:
@deprecated
void oldMethod() {
  // 旧的实现
}

// 推荐使用新方法
void newMethod() {
  // 新的实现
}

效果:
• IDE会在使用时显示删除线
• 编译器会发出警告
• 帮助平滑过渡到新API

Flutter示例:
@deprecated
void setState(VoidCallback fn) {
  // 旧版本
}

// 使用时会看到警告提示
      ''';
    });
  }

  void _demonstrateRequired() {
    setState(() {
      result = '''
【@required 注解】
(Dart 2.12+ 使用 required 关键字替代)

旧用法 (Dart 2.12之前):
class User {
  User({@required this.name, this.age});
  
  final String name;
  final int age;
}

新用法 (Dart 2.12+):
class User {
  User({required this.name, this.age});
  
  final String name;
  final int? age;
}

在Flutter Widget中:
class MyWidget extends StatelessWidget {
  const MyWidget({
    super.key,
    required this.title,  // 必需参数
    this.subtitle,        // 可选参数
  });
  
  final String title;
  final String? subtitle;
}

使用:
MyWidget(title: '标题') // ✓ 正确
MyWidget() // ✗ 错误：缺少required参数
      ''';
    });
  }

  void _demonstrateImmutable() {
    setState(() {
      result = '''
【@immutable 注解】
标记类为不可变的，所有字段都应该是final。

示例:
@immutable
class Point {
  const Point(this.x, this.y);
  
  final int x;
  final int y;
}

如果类中有非final字段，会收到警告:
@immutable
class BadPoint {
  int x; // ⚠️ 警告：不应该有可变字段
  int y;
}

Flutter中的应用:
• 所有Widget都应该是不可变的
• 使用@immutable确保Widget不会被意外修改
• 提高性能和可预测性

@immutable
class MyWidget extends StatelessWidget {
  const MyWidget({super.key, required this.title});
  
  final String title; // 必须是final
}
      ''';
    });
  }

  void _demonstrateCustomAnnotations() {
    setState(() {
      result = '''
【自定义注解】
可以创建自己的注解类。

定义注解:
class Todo {
  final String task;
  final String assignee;
  
  const Todo(this.task, this.assignee);
}

使用注解:
@Todo('实现登录功能', '张三')
void login() {
  // 待实现
}

@Todo('优化性能', '李四')
class DatabaseService {
  // ...
}

注意事项:
• 注解类必须有const构造函数
• 注解主要用于元编程和代码生成
• Flutter常用的代码生成库：
  - json_serializable
  - freezed
  - retrofit

示例 - JSON序列化:
@JsonSerializable()
class User {
  final String name;
  final int age;
  
  User(this.name, this.age);
}
      ''';
    });
  }

  void _demonstrateCommonAnnotations() {
    setState(() {
      result = '''
【常用注解总结】

1. @override
   重写父类方法

2. @deprecated
   标记过时的API

3. required (关键字)
   标记必需的命名参数

4. @immutable
   标记不可变类

5. @protected
   标记受保护的成员（仅子类可访问）

6. @visibleForTesting
   标记仅用于测试的成员

7. @mustCallSuper
   强制子类调用super方法

示例:
class BaseWidget extends StatefulWidget {
  @mustCallSuper
  @override
  void initState() {
    super.initState();
  }
}

@visibleForTesting
void internalMethod() {
  // 仅测试时使用
}

@protected
void protectedMethod() {
  // 仅子类可访问
}
      ''';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Dart 注解'),
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            // 说明卡片
            Card(
              color: Colors.pink.shade50,
              child: const Padding(
                padding: EdgeInsets.all(16),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(
                      '🏷️ 注解概述',
                      style: TextStyle(
                        fontSize: 18,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    SizedBox(height: 8),
                    Text(
                      '注解为代码提供元数据，用于：\n'
                      '• 标记代码的特殊用途\n'
                      '• 提供编译器提示和警告\n'
                      '• 支持代码生成工具\n'
                      '• 增强代码可读性',
                      style: TextStyle(fontSize: 14),
                    ),
                  ],
                ),
              ),
            ),
            const SizedBox(height: 16),

            // 代码示例区域
            Container(
              padding: const EdgeInsets.all(16),
              decoration: BoxDecoration(
                color: Colors.grey.shade200,
                borderRadius: BorderRadius.circular(8),
              ),
              child: const Text(
                '''// 常用注解
@override
void method() { }

@deprecated
void oldMethod() { }

class Widget {
  Widget({required this.child});
  final Widget child;
}

@immutable
class MyClass { }

@Todo('task', 'assignee')
void futureFeature() { }

// 代码生成注解
@JsonSerializable()
class User { }''',
                style: TextStyle(
                  fontFamily: 'monospace',
                  fontSize: 13,
                ),
              ),
            ),
            const SizedBox(height: 16),

            // 交互按钮
            Wrap(
              spacing: 8,
              runSpacing: 8,
              children: [
                ElevatedButton.icon(
                  onPressed: _demonstrateOverride,
                  icon: const Icon(Icons.refresh),
                  label: const Text('@override'),
                ),
                ElevatedButton.icon(
                  onPressed: _demonstrateDeprecated,
                  icon: const Icon(Icons.warning),
                  label: const Text('@deprecated'),
                ),
                ElevatedButton.icon(
                  onPressed: _demonstrateRequired,
                  icon: const Icon(Icons.error),
                  label: const Text('required'),
                ),
                ElevatedButton.icon(
                  onPressed: _demonstrateImmutable,
                  icon: const Icon(Icons.lock),
                  label: const Text('@immutable'),
                ),
                ElevatedButton.icon(
                  onPressed: _demonstrateCustomAnnotations,
                  icon: const Icon(Icons.add_circle),
                  label: const Text('自定义注解'),
                ),
                ElevatedButton.icon(
                  onPressed: _demonstrateCommonAnnotations,
                  icon: const Icon(Icons.list),
                  label: const Text('常用注解'),
                ),
              ],
            ),
            const SizedBox(height: 16),

            // 结果展示区域
            Card(
              elevation: 4,
              child: Container(
                width: double.infinity,
                padding: const EdgeInsets.all(16),
                constraints: const BoxConstraints(minHeight: 150),
                child: Text(
                  result,
                  style: const TextStyle(
                    fontSize: 14,
                    fontFamily: 'monospace',
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// 自定义注解类
class Todo {
  final String task;
  final String assignee;

  const Todo(this.task, this.assignee);
}

